package com.zsr.controller;

import com.zsr.pojo.Cat;
import com.zsr.pojo.Dog;
import com.zsr.pojo.FormBean;
import com.zsr.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.List;

/**
 * @Author zsr
 * @Description 接收参数类型
 * @Date 2021/4/29 9:34
 */
@Controller
@RequestMapping("/user")
@SessionAttributes("errorMsg")
public class UserController {

    //如果请求参数名称和形参名称不同 ==> 使用RequestParam注解
    @GetMapping("/t1")
    public String test1(@RequestParam("name") String name){
        System.out.println(name);
        return "test";
    }

    //接收一个对象
    //user/t2?id=1&age=12&name=sss
    @GetMapping("/t2")
    public String test2(User user){
        System.out.println(user);
        return "test";
    }

    /**
     * 接收数组类型的参数
     * /user/batchDelete?ids=11&ids=22
     */
    @RequestMapping("/batchDelete")
    public ModelAndView batchDelete(Long[] ids){
        System.out.println(Arrays.asList(ids));
        return null;
    }

    /**
     * 接收集合List，不能直接接受,可以在对象中存在一个集合
     * 此时操作多参数数值时使用数组会更简单，
     * 以后操作list集合一般都是出于对象中，不会直接操作
     * /user/batchDelete2?ids=11&ids=22
     * @param fb
     */
    @RequestMapping("/batchDelete2")
    public ModelAndView batchDelete2(FormBean fb){
        List<Long> ids = fb.getIds();
        System.out.println(ids);
        return null;
    }

    /**
     * 不使用ModelAttribute 注解
     * @param u
     * @return
     */
    @RequestMapping("/ma1")
    public String test3(User u,Model model){
        //jsp页面可以${user}直接获取
        System.out.println(u);
        //jsp页面可以${myuser}获取
        model.addAttribute("myuser",u);
        return "welcome";
    }

    /**
     * 使用ModelAttribute 注解
     * @param u
     * @return
     */
    @RequestMapping("/ma2")
    public String test4(@ModelAttribute("mauser") User u){
        //jsp页面${mauser}获取,{user}获取不到
        System.out.println(u);
        return "welcome";
    }

    //获取请求头中的User-Agent和Cookie信息
    //以前的方法
    @RequestMapping("/head1")
    public void test5(HttpServletRequest request){
        String header = request.getHeader("User-Agent");
        String cookie = request.getHeader("Cookie");
        System.out.println(header);
        System.out.println(cookie);//JSESSIONID=A260DD8973E543761C7C0A880B52A5D0
    }
    //现在的方法
    @RequestMapping("/head2")
    public void test6(@RequestHeader("User-Agent") String userAgent, @CookieValue("JSESSIONID") String cookieName){
        System.out.println(userAgent);//Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36
        System.out.println(cookieName);//A260DD8973E543761C7C0A880B52A5D0
    }

    /**
     * 操作HttpSession;
     * 默认情况下Model数据是放到request中共享的,如果我想在session共享---->SessionAttributes注解
     * @param model
     * @return
     */
    @RequestMapping("/zy3")
    public String test7(Model model){
        model.addAttribute("errorMsg", "错误信息!");
        //默认肯定不能共享数据的,因为是重定向;
        // 之前讲过的那个Flash共享也仅仅只是在Controller之间共享
        //重定向无法访问WEB-INF下jsp
        return "redirect:/abc.jsp";
        /*
        *
        * ：${requestScope.errorMsg}   无值<br>
            ${sessionScope.errorMsg}   有值<br>
            ${errorMsg}                有值<br>
        * */
    }


    /*
	 	需要把表单数据封装到多个对象中去,如果各个对象都有相同的属性,此时要出问题.
	 		不知道该把哪一个参数封装到哪一个对象中去.

	 */
    // 参数-->对象,封装规则需要我们来设置

    // 把以dog.开头的参数封装到dog对象中
    @InitBinder("dog") // 自定义数据绑定注册,用于将请求参数转换到对应的对象的属性中去
    public void initBinderDogyType(WebDataBinder binder){
        binder.setFieldDefaultPrefix("dog.");
    }

    @InitBinder("cat")
    public void initBinderCatType(WebDataBinder binder){
        binder.setFieldDefaultPrefix("cat.");
    }

    @PostMapping("/save")
    public ModelAndView save(Cat cat, Dog dog){
        System.out.println(cat);
        System.out.println(dog);
        /**
         * Cat(name=rr, age=14)
         * Dog(name=gg, age=12)
         * */
        return null;
    }


}
